var no_show_picture = false;
var no_show_log = false;
var no_disp_control = false;
var need_confirm = null; 		// system need action confirmation. No alarm in first load 
var sound_notify = false;		// need sound notify ???

var alarm_sound = new Audio("img/error.ogg"); 		//sound ONLY OGG !

alarm_sound.addEventListener('ended',function()
	{
		this.currentTime = 0;
		this.play();
	}, false);

function setup_grid()
{
    var offsW = 21;
    var offsH = 50;


    var w = $('#content-mon').innerWidth() - offsW;
    var h = $('#content-mon').innerHeight() - offsH;

    $('#list').setGridHeight(h);
    $('#list').setGridWidth(w, true);

    var w2 = $('#header-mon-info').innerWidth();

    if (no_show_picture)
    {
        w2 -= 21;        
    }
    else
    {
        w2 -= 563;
    }

    $('#header-mon-info #info-log').width(w2);

}

function show_error(_data)
{
    dat = $.parseJSON(_data);

    if ('error' in dat)
    {
        alert("Ошибка: "+ dat.error);
    }
    else
    {
        alert(error_ok);
    }
}

function setup_scripts()
{
    if ($('#script-sel option:selected').hasClass('executed'))
    {
        $("#script-button").html('<span class="ui-button-text">Отменить сценарий</span>');
    }
    else
    {
        $("#script-button").html('<span class="ui-button-text">Выполнить сценарий</span>');
    }
}


function strip_len(_str)
{
  if (_str.length > 10)
  {
    return _str.substr(1,7)+'...';
  }
  else
  {
    return _str;
  }
}


function fill_scripts()
{
  $('#script-sel').load('req/eve_opt.php?type=opt', function (data)
  {
       $('#script-sel').html(data);
       setup_scripts();

       var row_cnt = 0;
       var script_list = '';

       $('#script-sel option.executed').each(function(_key, _val)
       {
            if (row_cnt <= 2)
            {
              if (row_cnt > 0) 
              {
                script_list += ',';
              }
              script_list += '"'+strip_len($(_val).html())+'"';

              row_cnt++;
            }
       });

       if (row_cnt == 0)
       {
         $('#script-info').hide();
       }
       else
       {
         $('#script-info').html('Выполняются скрипт(ы): ' + script_list);
         $('#script-info').show();
       }

  });
}

function render_log(_data)
{

    var rows = [];

    rows.push('<tr><th>Время</th><th>Контр</th><th>Оператор</th><th>Сообщение</th></tr>');

    if (_data != null) 
    {

    $.each(_data,function(_key, _val)
    {
        var cls='normal';

        if (_val.imp == '1')
        {
            cls='change';
        }
        else if(_val.imp == '2')
        {
            cls='error';
        }

        var note='';

        if (_val.log_type == 1)
        {
            note = _val.c_id;
        }

        var str = '<tr class="'+cls+'"><td id="log-date">'+localeDateTime(mysqlTimeStampToDate(_val.log_date))+'</td><td id="log-note">'+note+'</td><td id="log-user">'+((_val.user != null) ? _val.user : '&nbsp;')+'</td><td id="log-msg">'+_val.log_msg+'</td ></tr>';

        rows.push(str);
    });
    }

    for ( var i =  rows.length - 1 ; i < 8; i++)
    {
        rows.push('<tr><td id="log-date">&nbsp;</td><td id="log-note">&nbsp;</td><td id="log-user">&nbsp;</td><td id="log-msg">&nbsp;</th></tr>');
    }

    var tab = '<table id="log-tab">' + rows.join('') + '</table>';

    $("#info-table").html(tab);
    $("#info-table tr:nth-child(even)").addClass("even");

    var a = 5;
}

function show_log()
{
    var id = $('input[name=cid]').val();
    var sys = $('input[name=system]:checked').val();
    var filt = $('input[name=filt]:checked').val();

    $.getJSON("req/con_rule.php?oper=mlist&cid="+id+"&type="+sys+"&imp="+filt, render_log);
}

function datetime_form(_value, _options, _row)
{
    var date;

    if (_value == '?')
    {
        return '?';
    }
    else
    {
        try
        {
            date = localeDateTime(mysqlTimeStampToDate(_value));
        }
        catch(e)
        {
            date = '&mdash;';
        }
    }

    return '<span style="font-size:12px">'+date+'</span>';
}

function phase_form(_value, _options, _row)
{
    return (_value == 0 || _value == null) ? '&mdash;' : _value;
}

function prog_form(_value, _options, _row)
{
    if (_value == 0 || _value == null)
    {
        return '&mdash;';
    }
    else if (_value == 9)
    {
        return 'ЖМ';
    }
    else if (_value == 10)
    {
        return 'ОС';
    }
    else
    {
        return _value;
    }
}

var no_setup_row = false;

function first_row_sel(data)
{
    
    if(!no_setup_row)
    {
        var row = $('#list tr:nth-child(2)').attr('id');

        $("#list").jqGrid().setSelection(row, true);

        no_setup_row = true;
    }

    var has_error = false;

    $('#list [aria-describedby=list_fault]').each(function(_key, _val)
    {
        var val = $(_val).html();

        if ((val != "\u2014") && (val != '?'))
        {
            has_error = true;
        }

    });
    
    if (has_error)
    {
        $('#jqgh_list_fault').addClass('code-red');
    }
    else
    {
        $('#jqgh_list_fault').removeClass('code-red');
    }

}

var old_phase = -2;
var old_cont = -2;

function select_row(_id)
{
    var data = $(this).getRowData(_id);

    var phase = parseInt(data.phase);

    if (isNaN(phase))
    {
        phase = 9;
    }

    if (data.prog =='ЖМ')
    {
        phase = 0;
    }

    if (data.prog =='ОС')
    {
        phase = 9;
    }

    if ((!no_show_picture) && ((old_phase != phase) || (old_cont != _id)))
    {
        $('img[name=preview]').attr('src', 'req/pic_list.php?oper=disp&cid='+_id+'&phase='+phase);
        old_phase = phase;
        old_cid = _id;
    }

    $('input[name=cid]').val(_id);

    setup_control(parseInt(data.super_state));

    if (!no_show_log)
        show_log();
}

var control = false;			// this system (oparator) has control

function setup_control(_super_state)
{
    var phase = control;
    var cancel_phase = control;
    var prog = control;
    var cancel_prog = control;
    var script = control;
    
    if (control)
    {
        switch (_super_state)
        {
            case 0:
                phase = cancel_phase = prog = cancel_prog = false;
                script = true;
            break;
            case 1:
                phase = prog = script = true;
                cancel_phase = cancel_prog = false;
            break;
            case 2:
                phase = prog = cancel_prog = script = true;
                cancel_phase = false;
            break;

            case 3:
                phase = cancel_phase = prog = script = true;
                cancel_prog = false;
            break;

        }

        $('#disp-button').html('<span class="ui-button-text">Отменить управление</span>');
        $('#mode-info').html('Режим ДУ');
    }
    else
    {
        $("#disp-button").html('<span class="ui-button-text">Взять управление</span>');
        $('#mode-info').html('');
    }

    $('#phase-button').button({disabled:!phase});
    $('#cancel-phase-button').button({disabled:!cancel_phase});

    $('#program-button').button({disabled:!prog});
    $('#cancel-program-button').button({disabled:!cancel_prog});

    $('#script-button').button({disabled:!script});

    if (script)
    {
        $('#script-sel').removeAttr('disabled');
    }
    else
    {
        $('#script-sel').attr('disabled','');
    }

};

var grid_timeout = 5000;
var quick_rescan = 0;

function refresh_grid()
{
    var row = $("#list").jqGrid('getGridParam','selrow'); 

    $.ajaxSetup({async: false});

    if ( !no_disp_control )
    {
        $.getJSON('req/usr_token.php?oper=check', function (data)   
        {
            control = data.disp;
            
            need_confirm = data.need_confirm;
            
            $('#confirm-button').button({disabled:!need_confirm});
            
            if (need_confirm != null)
            	{
            		if (sound_notify && need_confirm)
            		{
            			alarm_sound.play();
            		}
            		else
            		{
            			alarm_sound.pause();            			
            		}
            	}
        });
    }

    var top = $(".ui-jqgrid-bdiv").scrollTop();

    $("#list").jqGrid().trigger("reloadGrid"); 

    $.ajaxSetup({async: true});

    $("#list").jqGrid().setSelection(row, true);

    $(".ui-jqgrid-bdiv").scrollTop(top);

    fill_scripts();


    if (quick_rescan > 0)
    {
        setTimeout(refresh_grid, 1000); //adaptive scan
        quick_rescan --;
    }
    else
    {
        setTimeout(refresh_grid, grid_timeout);
    }
}

$(function() { 

  $("#list").jqGrid({
    url:'req/con_mon.php',
    datatype: 'json',
    mtype: 'GET',
    colNames:['№ Контр', 'Группа', 'Идентификатор СО','Режим контроллера','Неисправность', '№ прог', '№ фазы', 'Последний опрос', 'Время контроллера','SuperState'],
    colModel :[ 
      {name:'c_id', width:60, index:'c_id',align:'center', fixed: true }, 
      {name:'g_name', index:'g_name' }, 
      {name:'location', index:'location' }, 
      {name:'state', sortable: false, width:200, align:'center',fixed: true },
      {name:'fault', sortable: false, width:200,align:'center', fixed: true },
      {name:'prog', sortable: false, width:50,align:'center', fixed: true, formatter: prog_form },
      {name:'phase', sortable: false, width:50,align:'center', fixed: true, formatter: phase_form },
      {name:'last_time', sortable: false,align:'center', width:140, fixed: true, formatter: datetime_form },
      {name:'local_time', sortable: false,align:'center', width:140, fixed: true, formatter: datetime_form },
      {name:'super_state', sortable: false, hidden: true }
    ],
    sortname: 'c_id',
    sortorder: 'desc',
    loadComplete: first_row_sel,
    onSelectRow: select_row
  });
  
  $.ajaxSetup({async: false});
  
  $.post('req/dat_edit.php',{oper:'load'},function(data)
  {
    var dat = $.parseJSON(data);
                
    $('#header-mon #title').html((typeof(dat.title) == 'undefined')? '' : dat['title']);
    
    if (!(typeof(dat['mon-rescan']) == 'undefined'))
    {
      grid_timeout = parseInt(dat['mon-rescan']) * 1000;
    }

    if ((typeof(dat['vis-plan']) != 'undefined') && (dat['vis-plan'] != 1))
    {
            $('#info-pic').hide();  
            no_show_picture = true;
    }

    if ((typeof(dat['vis-proto']) != 'undefined') && (dat['vis-proto'] != 1))
    {
        $('#info-log').hide();  
        no_show_log = true;
    }

    if (no_show_picture && no_show_log)
    {
        $('#header-mon-info').hide();
        $('#content-mon').css('top','40px');
    }

    if (((typeof(dat['vis-disp']) != 'undefined') && (dat['vis-disp'] != 1)) || user_is_operator)
    {
        $('#disp-button').button({disabled: true});  
        no_disp_control = true;
    }
    
    if (dat["sound-alarm"] != null)
   	{
    	sound_notify = (dat["sound-alarm"] != 0); 
   	}
    else
   	{
    	sound_notify = false;
   	}

  });

  $.ajaxSetup({async: true});

  setup_grid();

  $(window).resize(setup_grid);

  setTimeout(refresh_grid, grid_timeout);

  fill_scripts();

  $("#sys-radio" ).buttonset().change(show_log);
  $("#filt-log" ).buttonset().change(show_log);

  $("#full-log").button().click(function()
    {
        var sel_cid = $('input[name=cid]').val();
        location.href = "log.php?back=monitor.php&cid="+sel_cid;
    }
  );

  $( "#phase-button" )
            .button()
            .click(function() {
                $( "#set-phase-form" ).dialog("open"); 
            });

  $( "#program-button" )
            .button()
            .click(function() {
                $( "#set-prog-form" ).dialog("open");
            });

  $( "#disp-button" )
            .button()
            .click(function() { 

                if (control)
                {
                    $.getJSON('req/usr_token.php?oper=free', function (data)
                    {
                        if ('error' in data)
                        {
                            alert("Ошибка: "+ data.error);
                        }
                        else
                        {
                            alert(data.status);
                            control = false;
                            quick_rescan = 5;
                        }

                    });
                }
                else
                {
                    $.getJSON('req/usr_token.php?oper=lock', function (data)
                    {
                        if ('error' in data)
                        {
                            if (confirm("Внимание: "+ data.error + '\n\nВзять управление принудительно ?'))
                            {
                                $.getJSON('req/usr_token.php?oper=lock&force=1', function (data)
                                {
                                    if ('error' in data)
                                    {
                                        alert("Ошибка: "+ data.error);
                                    }
                                    else
                                    {
                                        alert(data.status);
                                        control = true;
                                        quick_rescan = 5;
                                        setup_scripts();
                                    }
                                });
                            }
                        }
                        else
                        {
                            alert(data.status);
                            control = true;
                            quick_rescan = 5;
                            setup_scripts();
                        }

                    });
                    
                }

                if (control)
                {
                    var gr = $("#list").jqGrid().getGridParam('selrow'); 

                    if( gr != null ) 
                    {
                       var data = $("#list").jqGrid().getRowData(gr);
                       setup_control(parseInt(data.super_state));
                    }
                }
                else
                {
                    setup_control(0);
                }
            });


  $( "#script-button" )
            .button()
            .click(function() {

                var sid = $('select#script-sel option:selected');

                var conf_text = 'Выполнить сценарий: ';
                var oper = 'script';

                    
                if ($(sid).hasClass('executed'))
                {
                    conf_text = 'Отменить сценарий: ';
                    oper = 'cancel';
                }

                if (confirm(conf_text + '\n"' + $(sid).text() +'" ?'))
                {
                        $.get('req/con_rule.php?oper='+oper+'&eid='+$(sid).val(),

                        function(data)
                        {
                            dat = $.parseJSON(data);

                            if ('error' in dat)
                            {
                                alert("Ошибка:"+ dat.error);
                            }
                            else
                            {
                                alert(dat.status);
                                quick_rescan = 5;
                            }
                    });
               }

            });

  $( "#exit-button" )
            .button()
            .click(function() {
               if (confirm("Выйти из СДУ СО ?"))
               {
                    location.href = 'logout.php'; 
               }
            });
 
  function setup_phase(_phase)
  {
    quick_rescan = 5;

    $( "#set-phase-form" ).dialog('close');

    var phase_cmd = (_phase != 0 ) ? (_phase | 0x80) : _phase; // set TU bit if not cancel
    var sel_cid = $('input[name=cid]').val();                   // controller to set

    $.get('req/con_rule.php?oper=cmd&cid='+sel_cid+'&cmd=phase&param='+phase_cmd, show_error);
  }

  $( "#set-phase-form" ).dialog({
            autoOpen: false,
            height: 'auto',
            width: 'auto',
            modal: true,
            resizable: false,
            dialogClass: 'phase-dialog',
            buttons:
            {
                "Фаза 1": function () { error_ok = "Выполнена команда установки фазы !"; setup_phase(1); },
                "Фаза 2": function () { error_ok = "Выполнена команда установки фазы !"; setup_phase(2); },
                "Фаза 3": function () { error_ok = "Выполнена команда установки фазы !"; setup_phase(3); },
                "Фаза 4": function () { error_ok = "Выполнена команда установки фазы !"; setup_phase(4); },
                "Фаза 5": function () { error_ok = "Выполнена команда установки фазы !"; setup_phase(5); },
                "Фаза 6": function () { error_ok = "Выполнена команда установки фазы !"; setup_phase(6); },
                "Фаза 7": function () { error_ok = "Выполнена команда установки фазы !"; setup_phase(7); },
                "Фаза 8": function () { error_ok = "Выполнена команда установки фазы !"; setup_phase(8); },
                "ЖМ"    : function () { error_ok = "Выполнена команда включения ЖМ !"; setup_phase(0x0e); },
                "ОС": function ()  { error_ok = "Выполнена команда отключения СО !"; setup_phase(0x0f); }

            }
   });

   $( "#cancel-phase-button" ).button().click(function () 
            { 
                    $( "#set-phase-form" ).dialog('close'); 

                    if (confirm('Отменить установку фазы?'))
                    {
                        error_ok = "Выполнена команда отмены установки фазы!"; 
                        setup_phase(0);
                    }
            });

  function setup_prog(_prog)
  {
    quick_rescan = 5;

    $( "#set-prog-form" ).dialog('close');

    var sel_cid = $('input[name=cid]').val();                   // controller to set

    $.get('req/con_rule.php?oper=cmd&cid='+sel_cid+'&cmd=sprog&param='+_prog, show_error);
  };

  $( "#set-prog-form" ).dialog({
            autoOpen: false,
            height: 'auto',
            width: 'auto',
            modal: true,
            resizable: false,
            dialogClass: 'prog-dialog',
            buttons:
            {
                "Прог. 1": function () { error_ok = "Выполнена команда вызова программы !"; setup_prog(1); },
                "Прог. 2": function () { error_ok = "Выполнена команда вызова программы !"; setup_prog(2); },
                "Прог. 3": function () { error_ok = "Выполнена команда вызова программы !"; setup_prog(3); },
                "Прог. 4": function () { error_ok = "Выполнена команда вызова программы !"; setup_prog(4); },
                "Прог. 5": function () { error_ok = "Выполнена команда вызова программы !"; setup_prog(5); },
                "Прог. 6": function () { error_ok = "Выполнена команда вызова программы !"; setup_prog(6); },
                "Прог. 7": function () { error_ok = "Выполнена команда вызова программы !"; setup_prog(7); },
                "Прог. 8": function () { error_ok = "Выполнена команда вызова программы !"; setup_prog(8); }
            }

  });

  $( "#cancel-program-button" ).button().click(function () 
            { 
                    $( "#set-prog-form" ).dialog('close'); 

                    if (confirm('Отменить вызов программы?'))
                    {
                        error_ok = "Выполнена команда отмены вызова программы!"; 
                        setup_prog(0);
                    }
            });
  
	var defaults = 
	{
			modal : true,
			resizable : false,
			closeOnEscape: false,
            open: function(event, ui) { $(".ui-dialog-titlebar-close", ui.dialog).hide();}, 			
			buttons : {
				  "Подтвердить" : function() 
				  {
					  $(this).dialog('close');

					  $.getJSON('req/con_rule.php?oper=confirm&lid='+defaults.confirm_data[defaults.data_i].lid, function(data)
							  {
						  		if (data.error)
						  		{
						  			alert(data.error)
						  		}
						  		else 
						  		{
						  			if (++defaults.data_i < defaults.confirm_data.length)
						  			{
						  				create_dialog(defaults.confirm_data[defaults.data_i]);
						  			}
						  			else
						  			{
						  	            $('#confirm-button').button({disabled:true});
						  	            
						  	           	if (sound_notify)
				  	            		{
				  	            			alarm_sound.pause();
				  	            		}
						  			}
						  		}
							  });
				  }
			  },
			  minHeight : 50,
			  dialogClass : 'modal-shadow'
	  };

function create_dialog(data)
{
	  alert = $.getOrCreateDialog('alert');

	  var msg = "Я подтверждаю что видел событие!</br></br>Время: <b>" + data.date + "</b><br/>";
	  if (data.cid > 0)
	  {
		  msg += "Контроллер:<b>" + data.cid + "</b><br/>";
	  }

	  msg += "<b>"+data.message+"</b>";

	  $("p", alert).html(msg);

	  alert.dialog($.extend({}, defaults));
}
 
$( "#confirm-button" ).button({disabled:true}).click(function () 
          {
		$.getJSON('req/con_rule.php?oper=getconfirm', function(data)
				{
					if (!data.norec)
					{
						defaults.confirm_data = data.data;
						defaults.data_i = 0;
				
				        create_dialog(defaults.confirm_data[defaults.data_i]);
					};
				});
	  
          });

  if (!use_alarm)
  {
	  $( "#confirm-button" ).hide();
  }
  
  $('#script-sel').change(function()
  {
     setup_scripts();
  });    

  setup_control(0);
    
});

